import js from '@eslint/js'
import globals from 'globals'
import reactHooks from 'eslint-plugin-react-hooks'
import reactRefresh from 'eslint-plugin-react-refresh'
import tseslint from 'typescript-eslint'
import { defineConfig, globalIgnores } from 'eslint/config'

export default defineConfig([
  globalIgnores(['dist']),
  {
    files: ['**/*.{ts,tsx}'],
    extends: [
      js.configs.recommended,
      tseslint.configs.recommended,
      reactHooks.configs['recommended-latest'],
      reactRefresh.configs.vite,
    ],
    languageOptions: {
      ecmaVersion: 2020,
      globals: globals.browser,
    },
    // 适用范围：所有文件（可通过 files 字段限制，如 files: ['**/*.tsx'] 仅对 TSX 生效）
    rules: {
      // --------------------------
      // 基础语法规则
      // --------------------------
      // 分号：强制结尾不加分号
      'semi': ['error', 'never'],
      // 引号：强制使用单引号
      'quotes': ['error', 'single', { avoidEscape: true, allowTemplateLiterals: true }], // avoidEscape 允许单引号内包含双引号
      // 禁止未使用的变量（TypeScript 项目建议用 @typescript-eslint 版本）
      'no-unused-vars': 'off', // 关闭原生规则
      '@typescript-eslint/no-unused-vars': ['warn', {
        argsIgnorePattern: '^_', // 允许下划线开头的参数未使用（如 (_, props) => {}）
        varsIgnorePattern: '^_', // 允许下划线开头的变量未使用
      }],
      // 禁止 console（开发环境警告，生产环境报错）
      'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'warn',
      // 禁止 debugger （开发环境警告，生产环境报错）
      'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'warn',
      // 禁止空函数（开发环境警告，生产环境报错）
      // 禁止空函数（允许箭头函数为空，如 () => {}）
      'no-empty-function': process.env.NODE_ENV === 'production' ? ['error', { allow: ['arrowFunctions'] }] : ['warn', { allow: ['arrowFunctions'] }],
      'react-hooks/exhaustive-deps': 'off',

      // --------------------------
      // TypeScript 规则（需 @typescript-eslint 插件）
      // --------------------------
      // 强制函数和类方法指定返回值类型
      '@typescript-eslint/explicit-function-return-type': process.env.NODE_ENV === 'production' ? ['error', {
        allowExpressions: true, // 允许表达式函数（如 const fn = () => 123）省略返回类型
        allowConciseArrowFunctionExpressionsStartingWithVoid: true, // 允许 () => void 形式的箭头函数
        // 可选：允许高阶函数（如回调）省略返回类型
        allowHigherOrderFunctions: true,
        // 可选：允许立即执行函数表达式（IIFE）省略返回类型
        allowIIFEs: true,
      }] : ['warn', {
        allowExpressions: true, // 允许表达式函数（如 const fn = () => 123）省略返回类型
        allowConciseArrowFunctionExpressionsStartingWithVoid: true, // 允许 () => void 形式的箭头函数
        // 可选：允许高阶函数（如回调）省略返回类型
        allowHigherOrderFunctions: true,
        // 可选：允许立即执行函数表达式（IIFE）省略返回类型
        allowIIFEs: true,
      }],
      // 禁止 any 类型
      '@typescript-eslint/no-explicit-any': 'error',
    },
  },
])
